package com.strange.mdl.module.mdl.service.user;

import java.util.*;

import com.strange.mdl.framework.common.enums.TerminalEnum;
import com.strange.mdl.module.mdl.controller.app.auth.vo.AppAuthLoginReqVO;
import com.strange.mdl.module.mdl.controller.app.auth.vo.AppAuthLoginRespVO;
import com.strange.mdl.module.mdl.controller.app.auth.vo.AppAuthSmsLoginReqVO;
import jakarta.validation.*;
import com.strange.mdl.module.mdl.controller.admin.user.vo.*;
import com.strange.mdl.module.mdl.dal.dataobject.user.MdlUserDO;
import com.strange.mdl.framework.common.pojo.PageResult;
import com.strange.mdl.framework.common.pojo.PageParam;
import org.springframework.transaction.annotation.Transactional;

/**
 * 用户 Service 接口
 *
 * @author 芋道源码
 */
public interface MdlUserService {

    /**
     * 创建用户
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createUser(@Valid MdlUserSaveReqVO createReqVO);

    /**
     * 更新用户
     *
     * @param updateReqVO 更新信息
     */
    void updateUser(@Valid MdlUserSaveReqVO updateReqVO);

    /**
     * 删除用户
     *
     * @param id 编号
     */
    void deleteUser(Long id);

    /**
    * 批量删除用户
    *
    * @param ids 编号
    */
    void deleteUserListByIds(List<Long> ids);

    /**
     * 获得用户
     *
     * @param id 编号
     * @return 用户
     */
    MdlUserDO getUser(Long id);


    MdlUserDO getUserByDharmaName(String dharmaName);

    /**
     * 获得用户分页
     *
     * @param pageReqVO 分页查询
     * @return 用户分页
     */
    PageResult<MdlUserDO> getUserPage(MdlUserPageReqVO pageReqVO);


    /**
     * 根据手机号，获得用户
     * @param mobile
     * @return
     */
    MdlUserDO getUserByMobile(String mobile);

    boolean isPasswordMatch(String password, String password1);

    void updateUserLogin(Long userId, String clientIP);

    /**
     * 基于手机号创建用户。
     * 如果用户已经存在，则直接进行返回
     *
     * @param mobile     手机号
     * @param registerIp 注册 IP
     * @param terminal   终端 {@link TerminalEnum}
     * @return 用户对象
     */
    MdlUserDO createUserIfAbsent(String mobile, String registerIp, Integer terminal);
}